/*
 日期：2025-05-30
 作者：lijj
 作用：多接受者处理耗时测试[send]
 详情：
    测试个数           发送消息耗时             attach 耗时             detach 耗时
    100                0.297582 ms            0.508366 ms             0.478572 ms
    1000               3.85406 ms             19.194 ms               32.7948 ms
    10000              32.2579 ms             986.112 ms              1637.23 ms
    100000             362.037 ms             94973.2 ms              162148 ms
    200000             780.409 ms             380543 ms               675723 ms
 测试结果：
    1. 接受者超过 10000 时，attch 和 detach 遍历时间变长
    2. 而正常发送消息 100000 接受者只需 332 ms
    3. 对于正常项目开发来说足够使用
*/

#include <iostream>
#include <string>
#if defined(_WIN32)
#include <Windows.h>
#include <process.h>
#else
#include <unistd.h>
#endif
#include <chrono>
#include "mgnotify.h"
#include "center.hpp"

using namespace std;
using namespace chrono;

typedef std::chrono::high_resolution_clock::time_point chpt;

class carrier : public BaseMessage<carrier>
{
public:
    string name;
    // 测试耗时: 开始时间
    chpt start_time;
};

class recv1 : public BaseHandle<carrier>
{
public:
    recv1() : _id(-1) {}
    ~recv1() {}
    void setId(int id) { _id = id; }
    virtual bool handle(const carrier* msg) override;
private:
    int _id;
};


void logo()
{
    cout << endl;
    cout << endl;
    cout << "  _________ __                        \n";  
    cout << " /   _____//  |_  ____   ____   ____     \n"; 
    cout << " \\_____  \\\\   __\\/  _ \\ /    \\_/ __ \\    \n"; 
    cout << " /        \\|  | (  <_> )   |  \\  ___/    \n"; 
    cout << "/_______  /|__|  \\____/|___|  /\\___  >  \n";
    cout << "        \\/                  \\/     \\/   \n";
    cout << endl;
    cout << endl;
}

void title()
{
    cout << endl;
    cout << "  日期：2025-05-30 \n";  
    cout << "  作者：lijj \n"; 
    cout << "  作用：多接受者处理耗时测试[send] \n"; 
    cout << "  详情：单个消息发送者、多个接受者，测试分别一个消息发送对应 100、1000、10000、100000、200000 个接受者耗时情况 \n"; 
    cout << endl;
}

void enter()
{
    logo();
    title();
    while(true) {
        string in;
        cin >> in;
        cout << "enter: " << in << endl;
        if(in == "quit")
            break;
    }
}

int main()
{
#if defined(_WIN32 )
    SetConsoleOutputCP(65001); // UTF-8 
    SetConsoleCP(65001);       // 输入也设为UTF-8 
#endif 
    thread t(enter);
#if defined(_WIN32)
    Sleep(100);
#else
    sleep(0.1);
#endif
    list<recv1*> rs1;
    auto start = high_resolution_clock::now();
    int count = 100;
    for(int i = 0; i < count; i++) {
        recv1 *r1 = new recv1;
        r1->setId(i);
        rs1.push_back(r1);
    }
    auto end = high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end - start;
    cout << "attach " << count << " 接受者耗时：" << elapsed.count() << " ms." << endl;
    carrier m1;
    m1.start_time = high_resolution_clock::now();
    m1.name = "ljj";
    m1.send();
    t.join();
    start = high_resolution_clock::now();
    while (!rs1.empty()) {
        auto t = rs1.back();
        rs1.pop_back();
        delete t;
        t = nullptr;
    }
    end = high_resolution_clock::now();
    elapsed = end - start;
    cout << "detach " << count << " 接受者耗时：" << elapsed.count() << " ms." << endl;
    
    return 0;
}

bool recv1::handle(const carrier* msg)
{
    auto end = high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end - msg->start_time;
    cout << "recv1--> id: " << _id << " name: " << msg->name << ", 从开始发送消息到接受消息耗时： " << elapsed.count() << " ms." << endl;

    return true;
}